#ifndef MIREGISTROVARIABLE_H_
#define MIREGISTROVARIABLE_H_

#include "../includes.h"
#include <iostream>

class MiRegistroVariable: public Objeto {

private:
	std::string miString;
	int miInt;
	int *miLista;
	int cantidadElementosLista;

public:
	MiRegistroVariable(std::string miStringID, int miInt, int *miLista, int cantidadElementosLista){
		this->miString = miStringID;
		this->miInt = miInt;
		this->miLista = miLista;
		this->cantidadElementosLista = cantidadElementosLista;
	}
	MiRegistroVariable(const MiRegistroVariable& otro){
		this->miString = otro.miString;
		this->miInt = otro.miInt;
		this->cantidadElementosLista = otro.cantidadElementosLista;
		this->miLista = new int[otro.cantidadElementosLista];
		for (int i = 0; i < cantidadElementosLista; ++i) {
			this->miLista[i] = otro.miLista[i];
		}
	}

	MiRegistroVariable(const Bytes& serializacion) {
		miLista = NULL;
		hidratarse(serializacion);
	}

	virtual ~MiRegistroVariable(){
		if (miLista != NULL) {
			delete [] miLista;
		}
	};

    int getCantidadElementosLista()
    {
        return cantidadElementosLista;
    }

    int getMiInt()
    {
        return miInt;
    }

    int *getMiLista()
    {
        return miLista;
    }

    std::string getMiStringID()
    {
        return miString;
    }

	virtual Bytes serializarse() {
		Bytes serializacion;
		int tamanioString = this->miString.size();
		serializacion.agregarAlFinal(&tamanioString,sizeof(int));
		serializacion.agregarAlFinal(miString);
		serializacion.agregarAlFinal(&miInt,sizeof(int));
		serializacion.agregarAlFinal(&cantidadElementosLista,sizeof(int));
		serializacion.agregarAlFinal(miLista,sizeof(int)*cantidadElementosLista);
		return serializacion;
	}

	virtual bool hidratarse(const Bytes& serializacion) {
		offset offset = 0;

		int tamanioString;
		serializacion.leer(&tamanioString,offset,sizeof(int));
		offset += sizeof(int);

		miString = serializacion.getSubBytes(offset,tamanioString).toString();
		offset += tamanioString;

		serializacion.leer(&miInt,offset,sizeof(int));
		offset += sizeof(int);

		serializacion.leer(&cantidadElementosLista,offset,sizeof(int));
		offset += sizeof(int);

		if (miLista != NULL) {
			delete [] miLista;
		}
		miLista = new int[cantidadElementosLista];
		serializacion.leer(miLista,offset,sizeof(int)*cantidadElementosLista);
		return true;
	}

};

#endif /* MIREGISTROVARIABLE_H_ */
